﻿/*参数化配置说明
 * 1.所有的参数节都用{}包裹
 * 2.配置参数说明:
 *  2.1 日期相关参数
 *    "/d":日期参数
 *    "/t":时间参数
 *  2.2 运行时相关参数
 *    "/m":当前机器名
 *    "/ti":当前线程ID
 *    "/tn":当前线程名称
 * 3.格式参数说明
 *  3.1 格式参数在配置参数之后,以[]包裹.
 *  3.2 日期的偏移量设置，在日期格式之后以() 包裹,其中是偏移量,以天为单位
 */

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace MyLibrary.Text.Match
{
    //\{[^\}]+\}
    /// <summary>
    /// 模式化配置参数
    /// </summary>
    public class ParameterFitter
    {
        public ParameterFitter()
        {
        }

        public string Fit(string orgString)
        {
            Regex regx = new Regex(@"\{[^\}]+\}");
            MatchCollection matchs = regx.Matches(orgString);
            if (matchs.Count == 0)
                return orgString;

            string result = orgString;
            string replace = String.Empty;

            foreach (System.Text.RegularExpressions.Match m in matchs)
            {
                if (m.Value.Contains("/d"))
                {
                    replace = DateParameterParser.Instance.Parser(m.ToString());
                    result = result.Replace(m.Value, replace);
                }
                //TODO:其他的转换器
            }
            return result;
        }
    }

    /// <summary>
    /// 日期参数转化器
    /// </summary>
    public sealed class DateParameterParser : IFormatParser
    {
        private static DateParameterParser _instance = null;

        public static DateParameterParser Instance
        {
            get
            {
                if (_instance == null)
                    _instance = new DateParameterParser();
                return _instance;
            }
        }

        #region 构造函数
        public DateParameterParser()
        {
        }
        #endregion

        /// <summary>
        /// 日期转换函数
        /// </summary>
        /// <param name="formatString">格式化的参数</param>
        /// <returns>替换值</returns>
        public string Parser(string formatString)
        {
            if (String.IsNullOrEmpty(formatString)) throw new ArgumentNullException(formatString);

            string result = String.Empty;
            string format = "yyyy-MM-dd";
            int delayDate = 0;

            Regex formatRegex = new Regex(@"\[[^\]]+\]");
            System.Text.RegularExpressions.Match match = formatRegex.Match(formatString);
            if (match.Success)
                format = match.Value.Trim('[', ']'); ;

            Regex delayRegex = new Regex(@"\([^\)]+\)");
            System.Text.RegularExpressions.Match match2 = delayRegex.Match(formatString);
            if (match2.Success)
                Int32.TryParse(match2.Value.Trim('(', ')'), out delayDate);

            return DateTime.Today.AddDays((double)delayDate).ToString(format);
        }
    }

    public interface IFormatParser
    {
        string Parser(string formatString);
    }
}
